import { TMap } from '../map'
import { LngLat } from '../entity/lngLat'
import { Icon } from '../covering/icon'
import { Marker } from '../covering/marker'

/**
 * 创建标注工具时的属性对象
 */
export interface MarkToolOptions {
    /**
     * 图标类用来表达注记。
     * 默认设置为 `new L.Icon.Default()`
     */
    icon?: Icon;

    /**
     * 标记图标是否跟随鼠标
     */
    follow?: boolean
}

/**
 * 标注工具事件工厂对象
 */
type MarkToolEventFactory = {
    /**
     * 在用户每完成一次标注时触发事件
     *
     * ---
     *
     * - 特殊参数说明：
     *
     * `currentLnglat`：用户在地图上标的坐标。
     *
     * `currentMarker`：用户当前的标注点对象。
     *
     * `allMarkers`：用户使用工具所有的标注点对象
     */
    mouseup: (event: { type: 'mouseup', target: MarkTool, currentLnglat: LngLat, currentMarker: Marker, allMarkers: Array<Marker> }) => void
}

/**
 * 标注工具，用来让用户在地图上标注一个点，可以通过该工具获得用户标点的经纬度位置
 */
export interface MarkTool {
    /**
     * 创建一个标注工具
     *
     * @param map 地图对象
     *
     * @param opts 属性对象
     */
    new(map: TMap, opts?: MarkToolOptions): MarkTool;

    /**
     * 设置标注工具显示的标注图标路径的路径
     *
     * @param url 标注图标的路径 `URL`
     */
    setPointImage: (url: string) => void;

    /**
     * 获取用户标注点的坐标，如果用户尚未操作，则返回 `null`
     */
    getMarkControlPoint: () => LngLat | null;

    /**
     * 开启标注工具
     */
    open: () => boolean;
    /**
     * 关闭标注工具
     */
    close: () => void;

    /**
     * 清除工具绘制的所有标注图标
     */
    clear: () => void;

    /**
     * 获取所有工具绘制的标注图标
     */
    getMarkers: () => Array<Marker>;

    /**
     * 添加事件监听函数
     */
    addEventListener: <Event extends keyof MarkToolEventFactory>(event: Event, handler: MarkToolEventFactory[Event]) => void;
    
    /**
     * 移除事件监听函数
     */
    removeEventListener: <Event extends keyof MarkToolEventFactory>(event: Event, handler: MarkToolEventFactory[Event]) => void
}
